package com.cy.factory;

import javax.swing.*;

/**
 * <br>@class: AbstractFactory
 * <br>@description: 抽象工厂
 * <br>@author: cy
 * <br>@date: 2020-03-28 12:51:31
 * <br>@version: 1.0
 * <br>
 * <br>@since: (版本) 作者 时间 注释 
 */
public class AbstractFactory {
    //应用场景 程序需要处理不同系列的相关产品，但不希望它依赖于这些产品的具体类
    //避免具体产品与业务处理之间紧密耦合，且对工厂创建体可信
    //单一职责、开闭原则
    public static void main(String[] args) {
        //使用这个对象时，并不关心具体实现，实现类可以是 mysql，可以是 oracle，还可以是 任何符合规范的。
        IDatabaseUtilFactory databaseUtil=new MysqlUtil();
        IConnection ic = databaseUtil.getIConnection();
        ic.connect();
        ICommand icm = databaseUtil.getCommand();
        icm.sendCommand();
    }
}

// 不确定性 mysql  oracle
// 确定性  Connection、Command
//抽象体系
interface IConnection {
    void connect();
}
interface ICommand {
    void sendCommand();
}
//一系列相关或互相依赖的 实现
interface IDatabaseUtilFactory{
    IConnection getIConnection();
    ICommand getCommand();
}
//具象体系mysql
class MysqlConnection implements IConnection {

    @Override
    public void connect() {
        System.out.println("Mysql is Connected");
    }
}
class MysqlCommand implements ICommand{

    @Override
    public void sendCommand() {
        System.out.println("hello mysql");
    }
}
class MysqlUtil implements IDatabaseUtilFactory{

    @Override
    public IConnection getIConnection() {
        return new MysqlConnection();
    }

    @Override
    public ICommand getCommand() {
        return new MysqlCommand();
    }
}
//具象体系oracle

